// 引入axios
import axios from 'axios'

// 可以把固定的参数进行一个封装，然后再实现请求拦截
// create方法接收一个请求配置对象，返回一个实例
const Axios = axios.create({
    timeout:5000,
    baseURL:'/apis'
})

// 请求之前做拦截
Axios.interceptors.request.use(function(config){
    console.log(config);
    // let token = ''
    // 模拟有token数据
    let token = 'U2FsdGVkX18s+vFiHvFo27xcZQlFVdidkTmXuJaEikuoZ8lhQG++60s5aFdbxh5tBOJvApPlNPxtEFYKZMMWd5mXe4UauKuo/858oz9r950='


    // 定义一个数组，然后把所有的不需要拉结的地址在这里进行定义
    let otherPath = ['user/app/code', '/user/app/login']
    if(otherPath.includes(config.url)){
        return config
    } else {
        if(!token){
            return Promise.reject({code: 400, message: '当前用户没有登录，所以不能发出异步请求'})
        } else {
            // 可以对config数据进行加工，添加上token数据
            config.headers.token = token
            // 直接发出请求
            return config
        }
    }

    // 不存在，直接返回一个错误信息
    if(!token){
        return Promise.reject({code: 400, message: '当前用户没有登录，不能发出异步请求'})
    } else {
        return config
    }
})

// 可以使用实例的拦截属性来进行拦截
// 响应之后，需要使用use方法来注册有一个钩子函数，用于axios在完成请求之后来执行业务处理方法
Axios.interceptors.response.use(function(response) {
    // console.log(arguments);
    // 判断后端返回的状态码是否403，如果为403，直接抛出一个异常，中断请求，然后提示用户token失效需要重新登录
    if(response.data.code ===403){
        // throw new TypeError('用户的token错误或已失效，需要用户重新登录获取新的token')
        return Promise.reject('用户的token错误或已失效，需要用户重新登录获取新的token')
    }else {
        return response
    }
})


// 封装一个ajax请求方法
function ajaxFunc(req) {

    // 如果url地址没有传递，直接报错
    if(!req.url) {
        throw new SyntaxError('请求url参数是必传的')
    }


    return new Promise(resolve =>{
        // 把动态数据 url、method、params、data 抽取出来
        
        Axios.request({
            url: req.url, 
            method: req.method ||  'GET',
            // baseURL:'/apis',
            // headers: {token: 'test token'},
            // timeout:5000,
            params: req.params || {},
            data: req.data || {}
        }).then(({data}) =>{
            resolve(data);
        }).catch(e =>{
            console.log('...........请求失败');
            resolve(e);
        })
    })
}


export default ajaxFunc